package edu.hebeu.adapters;

import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;

import java.util.List;

import edu.hebeu.R;
import edu.hebeu.entity.ListGoodsResponse;
import edu.hebeu.network.APIConfig;

public class ListGoodsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final int TYPE_NORMAL = 0; // 普通条目类型
    private static final int TYPE_LOADER_MORE = 1; // 加载更多条目类型

    private List<ListGoodsResponse.Good> data; // 数据
    private OnItemClickListener onItemClickListener; // 某个条目被点击的监听器
    private OnUpPullListener onUpPullListener; // 上拉的监听器

    public ListGoodsAdapter(List<ListGoodsResponse.Good> data) {
        this.data = data;
    }

    /**
     * 该方法用于创建条目View
     * @param parent
     * @param viewType
     * @return
     */
    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view;
        if (viewType == TYPE_NORMAL) { // 如果是普通类型的条目
            view = View.inflate(parent.getContext(), R.layout.item_good_list, null);
            return new InnerHolder(view);
        } else { // 否则，即不是普通类型的条目(是加载类型的条目)
            view = View.inflate(parent.getContext(), R.layout.item_good_load, null);
            return new LoadMoreHolder(view);
        }
    }

    /**
     * 该方法用于绑定holder，一般用来设置数据
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
        if (getItemViewType(position) == TYPE_NORMAL && holder instanceof InnerHolder) {
            // 在这里设置数据
            ((InnerHolder) holder).setData(data.get(position));
        } else if (getItemViewType(position) == TYPE_LOADER_MORE && holder instanceof LoadMoreHolder){
            // 在这里设置数据
            ((LoadMoreHolder) holder).loadPrepare(LoadMoreHolder.LOADER_STATE_LOADDING); // 修改状态为正在加载
        }
    }

    /**
     * 返回条目的个数
     * @return
     */
    @Override
    public int getItemCount() {
        if (data != null) {
            return data.size() + 1; // *********** 保证最后一条的数据不是真数据(因为最后一条要作为加载框显示，所以要保证请求的数据在倒数第二个到之前的位置)
            // 例如：请求的数据长度是10，这里将他变成11，那么在到第11条数据(假数据，并不是请求的数据)时，就会通过getItemViewType()方法判断是否进行加载；
        }
        return 0;
    }

    @Override
    public int getItemViewType(int position) {
        if (position == getItemCount() - 1) { // 如果是最后一个数据
            // 将类型修改为加载更多
            return TYPE_LOADER_MORE;
        }
        return TYPE_NORMAL;
    }

    /*
    编写回调的步骤：
        1、创建这个接口；
        2、定义接口内部的方法；
        3、提供设置接口的方法(交由外部调用时实现)；
        4、接口方法的调用
     */

    /**
     * 这个方法用来暴漏给外部,让外部实现OnItemClickListener接口并作为参数传入此方法
     * @param listener
     */
    public void setOnItemClickListener(OnItemClickListener listener) {
        this.onItemClickListener = listener;
    }

    /**
     * 这个内部接口用来处理某个条目被点击的事件
     */
    public interface OnItemClickListener {

        /**
         * 这个方法用来处理某个Item被点击的事件
         * @param good
         */
        void onItemClick(ListGoodsResponse.Good good);
    }

    public void setOnUpPullListener(OnUpPullListener listener) {
        this.onUpPullListener = listener;
    }

    /**
     * 这个内部接口用来处理上拉刷新的实现
     */
    public interface OnUpPullListener {

        /**
         * 这个方法用来实现上拉的事件监听
         */
        void onUpPull(LoadMoreHolder loadMoreHolder);
    }

    public class LoadMoreHolder extends RecyclerView.ViewHolder {

        private LinearLayout ll_loading;
        private TextView tv_reload;

        public static final int LOADER_STATE_LOADDING = 0; // 加载状态为正在加载
        public static final int LOADER_STATE_RELOAD = 1; //加载状态为重新加载
        public static final int LOADER_STATE_NORMAL = 2; // 加载状态为平常

        public LoadMoreHolder(@NonNull View itemView) {
            super(itemView);
            ll_loading = itemView.findViewById(R.id.ll_loading);
            tv_reload = itemView.findViewById(R.id.tv_reload);

            tv_reload.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    loadPrepare(LOADER_STATE_LOADDING);
                }
            });
        }

        /**
         * 加载的初始化方法
         * @param state
         */
        public void loadPrepare(int state) {
            ll_loading.setVisibility(View.GONE); // 隐藏
            tv_reload.setVisibility(View.GONE); // 隐藏

            switch (state) {
                case LOADER_STATE_LOADDING: // 如果状态是正在加载
                    ll_loading.setVisibility(View.VISIBLE); // 显示
                    // 触发加载数据
                    startLoad(); // 执行加载更多的方法
                    break;
                case LOADER_STATE_RELOAD: // 如果状态是点击重新加载
                    tv_reload.setVisibility(View.VISIBLE); // 显示
                    break;
                case LOADER_STATE_NORMAL: // 如果是平常的(不是加载,而是普通的商品条目显示)
                    ll_loading.setVisibility(View.GONE); // 隐藏
                    tv_reload.setVisibility(View.GONE); // 隐藏
                    break;
            }
        }

        /**
         * 调用用户传入的监听器接口对象的实现方法(开始加载数据)
         */
        private void startLoad() {
            if (onUpPullListener != null) {
                onUpPullListener.onUpPull(this);
            }
        }
    }

    /**
     * 这个内部类用来将一个一个的商品条目信息加载到布局文件上
     */
    public class InnerHolder extends RecyclerView.ViewHolder {

        private ListGoodsResponse.Good good;
        private ImageView iv_prod;
        private TextView tv_prod;
        private TextView tv_prod_msg;
        private TextView tv_money;

        public InnerHolder(@NonNull View itemView) {
            super(itemView);
            iv_prod = (ImageView) itemView.findViewById(R.id.iv_prod);
            tv_prod = (TextView) itemView.findViewById(R.id.tv_prod);
            tv_prod_msg = (TextView) itemView.findViewById(R.id.tv_prod_msg);
            tv_money = (TextView) itemView.findViewById(R.id.tv_money);

            // 设置监听事件
            itemView.setOnClickListener(new View.OnClickListener() { // 当该Item被点击
                @Override
                public void onClick(View v) {
                    if (onItemClickListener != null) {
                        onItemClickListener.onItemClick(good); // 调用外部传入的 OnItemClickListener 接口监听器对象
                    }
                }
            });
        }

        public void setData(ListGoodsResponse.Good good) {

            this.good = good; // 获取这个商品的信息
            /*
            Glide加载图片时可以指定的参数，以实现在请求中、请求失败、请求为空时各显示的图片
             */
            RequestOptions requestOptions = new RequestOptions()
                .placeholder(R.drawable.hold) // 正在请求图片时展示的图片
                .error(R.drawable.error) // 如果请求失败时展示的图片(如果没有设置，还是展示placeholder的展位符)
                .fallback(R.drawable.fallback) // 如果请求的url为null时展示的图片(如果没有设置，还是展示placeholder的占位符)
                .override(100, 100); // 上述几种状态显示的占位符图片的大小
            /*
            使用Glide加载图片
             */
            Glide.with(itemView)
                .load("http://150.158.212.186:3001" + good.getSrc())
                .apply(requestOptions) // 设置请求该url在各个状态时控件的展位图片
                .into(iv_prod);

            tv_prod.setText(good.getName());
            tv_prod_msg.setText(good.getDescribe());
            tv_money.setText("￥" + good.getPrice());
        }
    }
}
